package main

import (
	"fmt"
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
)

type Person struct {
	Id_   bson.ObjectId `bson:"_id"`
	Name  string        `bson:"name"`
	Phone string        `bson:"phone"`
	Age   int           `bson:"age"`
}

func main() {
	//建立连接
	session, err := mgo.Dial("192.168.33.10:27017")
	if err != nil {
		panic(err)
	}
	defer session.Close()

	//切换到test数据库,并且切换到people集合
	c := session.DB("test").C("people")

	//插入操作
	err = c.Insert(&Person{Id_: bson.NewObjectId(), Name: "vison", Phone: "151239023"}, &Person{Id_: bson.NewObjectId(), Name: "jack", Phone: "1520340540"})
	if err != nil {
		panic(err)
	}

	//查询操作
	result := Person{}
	err = c.Find(bson.M{"name": "vison"}).One(&result)
	if err != nil {
		panic(err)
	}
	fmt.Println(result.Phone)

	//查询集合中所有用户
	var user []Person
	err = c.Find(nil).All(&user)
	fmt.Println(user)

	//根据ObjectId进行查找
	var user2 Person
	err = c.FindId(bson.ObjectIdHex("5c0a8bf46b2886df90dde422")).One(&user2)
	if err != nil {
		panic(err)
	}
	fmt.Println(user2.Name)

	var users Person
	//单条件查询操作
	//   =($eq)
	c.Find(bson.M{"name": "Jimmy Kuu"}).All(&users)
	//  !=($ne)
	c.Find(bson.M{"name": bson.M{"$ne": "Jimmy Kuu"}}).All(&users)
	//  >($gt)
	c.Find(bson.M{"age": bson.M{"$gt": 32}}).All(&users)
	//  <($lt)
	c.Find(bson.M{"age": bson.M{"$lt": 32}}).All(&users)
	//  >=($gte)
	c.Find(bson.M{"age": bson.M{"$gte": 33}}).All(&users)
	//  <=($lte)
	c.Find(bson.M{"age": bson.M{"$lte": 31}}).All(&users)
	//  in($in)
	c.Find(bson.M{"name": bson.M{"$in": []string{"Jimmy Kuu", "Tracy Yu"}}}).All(&users)

	//多条件查询
	//  and($and)
	c.Find(bson.M{"name": "Jimmy Kuu", "age": 33}).All(&users)
	// or($or)
	c.Find(bson.M{"$or": []bson.M{bson.M{"name": "Jimmy Kuu"}, bson.M{"age": 31}}}).All(&users)

	//修改
	//通过func (*Collection) Update来进行修改操作。
	//func (c *Collection) Update(selector interface{}, change interface{}) error
	//	注意修改单个或多个字段需要通过$set操作符号，否则集合会被替换。

	//修改字段的值($set)
	c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
		bson.M{"$set": bson.M{
			"name": "Jimmy Gu",
			"age":  34,
		}})

	// inc($inc) 字段增加值
	c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
		bson.M{"$inc": bson.M{
			"age": -1,
		}})

	// push($push)从数组中增加一个元素
	c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
		bson.M{"$push": bson.M{
			"interests": "Golang",
		}})

	// pull($pull)	从数组中删除一个元素
	c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")},
		bson.M{"$pull": bson.M{
			"interests": "Golang",
		}})

	//删除
	c.Remove(bson.M{"name": "Jimmy Kuu"})
}
